home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Arsenal Files 8
/
The Arsenal Files Collection #8 (Arsenal Computer) (1996).ISO
/
g_quake
/
dropde-2.zip
/
CHAIN.QC
< prev
next >
Wrap
Text File
|
1996-09-18
|
5KB
|
246 lines
/************\
* BreakChain *
\************/
void (entity Head) BreakChain =
{
local entity link;
link = Head.hook;
while (link != world)
{
Head = link.hook;
remove (link);
link = Head;
}
};
/*********\
* LinkPos *
\*********/
void () LinkPos =
{
makevectors (self.enemy.angles);
setorigin (self, self.owner.origin + ( ( ( self.enemy.origin +
(v_up * 16 * (!self.enemy.button2)) + (v_forward * 16) ) - self.owner.origin ) *
( self.weapon ) ) );
self.nextthink = time + 0.01;
};
/***********\
* MakeChain *
\***********/
entity (entity head, entity tail, float num) MakeChain =
{
local entity link, prevlink;
local float linknum;
linknum = num;
num = num + 1;
prevlink = world;
while (linknum > 0)
{
link = spawn();
link.hook = prevlink;
prevlink = link;
link.owner = head;
link.enemy = tail;
link.weapon = linknum / num;
link.movetype = MOVETYPE_NOCLIP;
link.solid = SOLID_NOT;
link.angles_z = 51 * linknum;
link.angles_y = 41 * linknum;
link.angles_x = 31 * linknum;
link.avelocity = '310 410 510';
setmodel (link, "progs/bit.mdl");
setsize (link, '0 0 0', '0 0 0');
makevectors (tail.angles);
setorigin (link, head.origin + ( ( ( tail.origin
+ (v_up * 16 * (!tail.button2)) + ( v_forward * 16 ) ) - head.origin )
* ( link.weapon ) ) );
link.nextthink = time + 0.01;
link.think = LinkPos;
linknum = linknum - 1;
}
return link;
};
/************\
* HookVanish *
\************/
void () HookVanish =
{
self.owner.hook = world;
// if (self.enemy.classname == "player")
// self.enemy.attack_finished = time + 0.1;
BreakChain (self);
remove (self);
};
/**********\
* HookPull *
\**********/
void () HookPull =
{
local vector vel, spray;
local float v;
if ( ((!self.owner.button0) && self.owner.weapon == IT_MORNINGSTAR)
|| self.owner.teleport_time > time || self.owner.deadflag )
{
// if (self.enemy.takedamage && self.weapon)
// self.enemy.nextthink = time + 0.1;
HookVanish();
return;
}
else
{
/*
if (self.enemy.takedamage)
{
sound (self, CHAN_WEAPON, "blob/land1.wav", 1, ATTN_NORM);
T_Damage (self.enemy, self, self.owner, 1);
makevectors (self.v_angle);
spray_x = 100 * crandom();
spray_y = 100 * crandom();
spray_z = 100 * crandom() + 50;
SpawnBlood (self.origin, spray, 20);
if (self.weapon > 0)
{
self.enemy.nextthink = time + 9999999;
if (self.enemy.classname == "player")
self.enemy.attack_finished = time + 9999999;
}
if (self.enemy.health <= 0)
{
if (self.weapon > 0)
self.enemy.nextthink = time + 0.1;
}
if (self.enemy.solid == SOLID_SLIDEBOX)
{
self.velocity = '0 0 0';
setorigin (self, self.enemy.origin
+ self.enemy.mins + (self.enemy.size * 0.5));
}
else
self.velocity = self.enemy.velocity;
}
else
*/
self.velocity = self.enemy.velocity;
if (self.enemy.solid == SOLID_NOT)
{
HookVanish();
return;
}
makevectors (self.owner.angles);
vel = self.origin - ( self.owner.origin + (v_up * 16 *
(!self.owner.button2)) + (v_forward * 16));
v = vlen (vel);
if (v <= 100)
vel = normalize(vel) * v * 10;
else
vel = normalize(vel) * 800;
self.owner.velocity = vel;
self.nextthink = time + 0.1;
}
};
/**************\
* T_ChainTouch *
\**************/
void() T_ChainTouch =
{
if (other == self.owner)
return; // don't attach to owner
if (pointcontents(self.origin) == CONTENT_SKY)
{
HookVanish();
return;
}
if (other.takedamage)
{
sound (other, CHAN_BODY, "zombie/z_hit.wav", 1, ATTN_NORM);
T_Damage (other, self, self.owner, 10);
SpawnBlood (self.origin, self.velocity, 10);
HookVanish(); // Don't attach to "living" things!
return;
}
else
{
self.avelocity = '0 0 0';
}
sound (self, CHAN_WEAPON, "weapons/bounce.wav", 1, ATTN_NORM);
if (!self.owner.button0)
{
HookVanish();
return;
}
else
{
if (other.solid == SOLID_SLIDEBOX)
{
setorigin (self, other.origin + other.mins + (other.size * 0.5));
self.velocity = '0 0 0';
}
else
{
self.velocity = other.velocity;
}
self.weapon = other.nextthink - time;
self.enemy = other;
self.nextthink = time + 0.1;
self.think = HookPull;
self.touch = SUB_Null;
}
};
/*************\
* W_FireChain *
\*************/
void() W_FireChain =
{
local entity ent;
ent = spawn ();
ent.classname = "morningstar";
ent.owner = self;
self.hook = ent;
ent.movetype = MOVETYPE_FLY;
ent.solid = SOLID_BBOX;
// set hook speed
makevectors (self.v_angle);
ent.velocity = aim(self, 800);
ent.velocity = ent.velocity * 800;
ent.angles = vectoangles(ent.velocity);
ent.avelocity = '0 0 -500';
ent.touch = T_ChainTouch;
// set hook sound
ent.nextthink = time + 5;
ent.think = HookVanish;
setmodel (ent, "progs/star.mdl");
setsize (ent, '0 0 0', '0 0 0');
setorigin (ent, self.origin + (v_forward*16) + '0 0 16' );
ent.hook = MakeChain (ent, self, 8);
};